Libraries:
library(tidyverse)
library(readr)
library(rvest)
library(stats)
library(readxl)
library(dplyr)
library(stringr)
library(ggplot2)
library(ggthemes)
library(stringr)
library(data.table)
library(geojsonio)
library(leaflet)
library(rgdal)
library(haven)
library(stargazer)
Data:
Model 3:
First making a graph of annual GDP highs and lows – maybe a temporary proxy for recessions?
Annual enrollment graph:
Join enrollment data and gdp data to create linear model test:
Graph it?
College Proximity Question 5/3: (Reading in Ivy’s data)
cz <- read_dta('cz.dta')
Error in read_dta("cz.dta") : could not find function "read_dta"
Read in/create mobility data: (Trends in Mobility: Commuting Zone Intergenerational Mobility Estimates by Birth Cohort) https://opportunityinsights.org/data/?geographic_level=101&topic=0&paper_id=0#resource-listing
Read in geojson file:
Commuting zones on the map (cz.geojson@data) are in 1990s format. They need to be converted so our post-2000 data can be connected to the shapefiles: (https://www.ers.usda.gov/data-products/commuting-zones-and-labor-market-areas/)
Try to run some lms:
Ivy’s STATA code:
foreach x of varlist ncollege nfouryr nfouryrpriv npub nelite hascollege{
foreach y of varlist kfr_pooled_pooled_p1 kfr_pooled_pooled_p25 kfr_pooled_pooled_p50 kfr_pooled_pooled_p75 kfr_pooled_pooled_p100 {
reg `y' `x' popdensity2010 med_hhinc2016, r
outreg2 using `x'_kfr, excel append ctitle(`y')
}
Variables of interest:
as.formula(paste0(yvar1, " ~ ", paste0(xvars1, collapse = " + ")))
kfr_pooled_pooled_p1 ~ ncollege + nfouryr + nfouryrpriv + npub +
nelite + hascollege + popdensity2010 + med_hhinc2016
testing?
stargazer(lm.kfr_p1,
type = "text",
dep.var.labels = c("kfr_pooled_pooled_p1"))
length of NULL cannot be changedlength of NULL cannot be changedlength of NULL cannot be changedlength of NULL cannot be changedlength of NULL cannot be changed
===============================================
Dependent variable:
---------------------------
kfr
-----------------------------------------------
ncollege 0.003
(0.004)
nfouryr 0.007*
(0.004)
nfouryrpriv -0.012***
(0.004)
npub -0.011***
(0.004)
nelite 0.006
(0.005)
hascollege -0.049***
(0.006)
popdensity2010 -0.0001***
(0.00001)
med_hhinc2016 0.00000***
(0.00000)
Constant 0.251***
(0.012)
-----------------------------------------------
Observations 741
R2 0.281
Adjusted R2 0.273
Residual Std. Error 0.062 (df = 732)
F Statistic 35.756*** (df = 8; 732)
===============================================
Note: *p<0.1; **p<0.05; ***p<0.01
nelite on kfr at different levels
htmtable.nelite <- stargazer(nelite.p1, nelite.p25, nelite.p50, nelite.p75, nelite.p100,
type = "html",
dep.var.labels = c("Bottom 1%", "25%", "50%", "75%", "Top 1%"),
out = "nelitetable.html")
length of NULL cannot be changedlength of NULL cannot be changedlength of NULL cannot be changedlength of NULL cannot be changedlength of NULL cannot be changed
<table style="text-align:center"><tr><td colspan="6" style="border-bottom: 1px solid black"></td></tr><tr><td style="text-align:left"></td><td colspan="5"><em>Dependent variable:</em></td></tr>
<tr><td></td><td colspan="5" style="border-bottom: 1px solid black"></td></tr>
<tr><td style="text-align:left"></td><td>Bottom 1%</td><td>25%</td><td>50%</td><td>75%</td><td>Top 1%</td></tr>
<tr><td style="text-align:left"></td><td>(1)</td><td>(2)</td><td>(3)</td><td>(4)</td><td>(5)</td></tr>
<tr><td colspan="6" style="border-bottom: 1px solid black"></td></tr><tr><td style="text-align:left">nelite</td><td>-0.004</td><td>-0.002</td><td>-0.001</td><td>0.001</td><td>0.004</td></tr>
<tr><td style="text-align:left"></td><td>(0.003)</td><td>(0.003)</td><td>(0.002)</td><td>(0.002)</td><td>(0.003)</td></tr>
<tr><td style="text-align:left"></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td style="text-align:left">popdensity2010</td><td>-0.0001<sup>***</sup></td><td>-0.0001<sup>***</sup></td><td>-0.00004<sup>***</sup></td><td>-0.00002<sup>***</sup></td><td>-0.00000</td></tr>
<tr><td style="text-align:left"></td><td>(0.00001)</td><td>(0.00001)</td><td>(0.00001)</td><td>(0.00001)</td><td>(0.00001)</td></tr>
<tr><td style="text-align:left"></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td style="text-align:left">med_hhinc2016</td><td>0.00000<sup>***</sup></td><td>0.00000<sup>***</sup></td><td>0.00000<sup>***</sup></td><td>0.00000</td><td>-0.00000<sup>***</sup></td></tr>
<tr><td style="text-align:left"></td><td>(0.00000)</td><td>(0.00000)</td><td>(0.00000)</td><td>(0.00000)</td><td>(0.00000)</td></tr>
<tr><td style="text-align:left"></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td style="text-align:left">Constant</td><td>0.221<sup>***</sup></td><td>0.350<sup>***</sup></td><td>0.471<sup>***</sup></td><td>0.585<sup>***</sup></td><td>0.770<sup>***</sup></td></tr>
<tr><td style="text-align:left"></td><td>(0.012)</td><td>(0.010)</td><td>(0.009)</td><td>(0.009)</td><td>(0.009)</td></tr>
<tr><td style="text-align:left"></td><td></td><td></td><td></td><td></td><td></td></tr>
<tr><td colspan="6" style="border-bottom: 1px solid black"></td></tr><tr><td style="text-align:left">Observations</td><td>741</td><td>741</td><td>741</td><td>741</td><td>741</td></tr>
<tr><td style="text-align:left">R<sup>2</sup></td><td>0.141</td><td>0.104</td><td>0.055</td><td>0.016</td><td>0.030</td></tr>
<tr><td style="text-align:left">Adjusted R<sup>2</sup></td><td>0.137</td><td>0.100</td><td>0.051</td><td>0.012</td><td>0.026</td></tr>
<tr><td style="text-align:left">Residual Std. Error (df = 737)</td><td>0.068</td><td>0.057</td><td>0.050</td><td>0.047</td><td>0.053</td></tr>
<tr><td style="text-align:left">F Statistic (df = 3; 737)</td><td>40.261<sup>***</sup></td><td>28.387<sup>***</sup></td><td>14.380<sup>***</sup></td><td>4.096<sup>***</sup></td><td>7.651<sup>***</sup></td></tr>
<tr><td colspan="6" style="border-bottom: 1px solid black"></td></tr><tr><td style="text-align:left"><em>Note:</em></td><td colspan="5" style="text-align:right"><sup>*</sup>p<0.1; <sup>**</sup>p<0.05; <sup>***</sup>p<0.01</td></tr>
</table>
Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Ctrl+Alt+I.
When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Ctrl+Shift+K to preview the HTML file).
The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike Knit, Preview does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed.
LS0tDQp0aXRsZTogImVjb240MDEgZmluYWwgcHJvamVjdCBSIE5vdGVib29rIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KTGlicmFyaWVzOg0KYGBge3IgbGlicmFyaWVzLCByZXN1bHRzID0gIm1hcmt1cCJ9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkocmVhZHIpDQpsaWJyYXJ5KHJ2ZXN0KQ0KbGlicmFyeShzdGF0cykNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoc3RyaW5ncikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZ2d0aGVtZXMpDQpsaWJyYXJ5KHN0cmluZ3IpDQpsaWJyYXJ5KGRhdGEudGFibGUpDQpsaWJyYXJ5KGdlb2pzb25pbykNCmxpYnJhcnkobGVhZmxldCkNCmxpYnJhcnkocmdkYWwpDQpsaWJyYXJ5KGhhdmVuKQ0KbGlicmFyeShzdGFyZ2F6ZXIpDQpgYGANCg0KRGF0YToNCmBgYHtyIGRhdGEsIGluY2x1ZGUgPSBGQUxTRX0NCiMgR0RQIHVwIHRvIEZlYiAyMDIwDQojIGh0dHBzOi8vaWhzbWFya2l0LmNvbS9wcm9kdWN0cy91cy1tb250aGx5LWdkcC1pbmRleC5odG1sDQpnZHAuaW5kZXguZGF0YSA8LSByZWFkeGw6OnJlYWRfeGxzeCgnVVMtTW9udGhseS1HRFAtSGlzdG9yeS1EYXRhLnhsc3gnLCBzaGVldCA9IDMpDQpnZHAuaW5kZXggPC0gZ2RwLmluZGV4LmRhdGENCmNvbG5hbWVzKGdkcC5pbmRleClbMV0gPC0gIllfTSINCnllYXIubW9udGggPC0gc3RyX3NwbGl0X2ZpeGVkKGdkcC5pbmRleCRZX00sICcgLSAnLCAyKQ0KY29sbmFtZXMoeWVhci5tb250aCkgPC0gYygnWWVhcicsICdNb250aCcpDQpnZHAuaW5kZXggPC0gY2JpbmQoeWVhci5tb250aCwgZ2RwLmluZGV4WywgLTFdKQ0KZ2RwLmFubnVhbCA8LSBnZHAuaW5kZXggJT4lDQogIGdyb3VwX2J5KFllYXIpICU+JQ0KICBzdW1tYXJpemUoTWF4R0RQID0gbWF4KGBNb250aGx5IFJlYWwgR0RQIEluZGV4YCksDQogICAgICAgICAgICBNaW5HRFAgPSBtaW4oYE1vbnRobHkgUmVhbCBHRFAgSW5kZXhgKSkNCg0KIyBodHRwczovL25jZXMuZWQuZ292L3Byb2dyYW1zL2RpZ2VzdC9kMTgvdGFibGVzL2R0MThfMzA2LjEwLmFzcA0KZW5yb2xsbWVudC5kYXRhIDwtIHJlYWRfeGxzKCd0YWJuMzA2LjEwLnhscycpDQplbnJvbGxtZW50IDwtIGVucm9sbG1lbnQuZGF0YVsxOjEyXQ0KIyBlbnJvbGxtZW50IGlzIGluIHRob3VzYW5kcw0KZW5yb2xsbWVudCA8LSBlbnJvbGxtZW50Wy1jKDEsIDMsIDE1LCAyNywgMzksIDUxLCA2MywgNzUsIDk5LCAxMTEsIDEyMywgMTM1OjEzOSksIF0NCmNvbDEgPC0gZGF0YS5mcmFtZShzdHJfcmVtb3ZlX2FsbChlbnJvbGxtZW50W1sxXV0sICdcXC4nKSwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQ0KY29sMVsyLCAxXSA8LSAiQWxsX1N0dWRlbnRzIg0KZW5yb2xsbWVudCA8LSBjYmluZChjb2wxLCBlbnJvbGxtZW50WywgLTFdKQ0KZW5yb2xsbWVudCA8LSB0KGVucm9sbG1lbnQpDQpyb3duYW1lcyhlbnJvbGxtZW50KSA8LSBjKCkNCmNvbG5hbWVzKGVucm9sbG1lbnQpIDwtIGVucm9sbG1lbnRbMSwgXQ0KZW5yb2xsbWVudCA8LSBkYXRhLmZyYW1lKGVucm9sbG1lbnQpDQpjb2xuYW1lcyhlbnJvbGxtZW50KVsxXSA8LSAnWWVhcicNCmVucm9sbG1lbnQgPC0gZW5yb2xsbWVudFstMSwgXQ0KWWVhcnMgPC0gYXMubnVtZXJpYyhzdHJfZXh0cmFjdChlbnJvbGxtZW50JFllYXIsICJbOmRpZ2l0Ol17NH0iKSkNCmVucm9sbG1lbnQgPC0gY2JpbmQoWWVhcnMsIGVucm9sbG1lbnRbLCAtMV0pDQplbnJvbGxtZW50IDwtIGRhdGEuZnJhbWUobGFwcGx5KGVucm9sbG1lbnQsIGZ1bmN0aW9uKHgpeyANCiAgZ3N1YigiLS0tIiwgTkEsIHgpDQp9KSkNCnN0cihlbnJvbGxtZW50KQ0KDQplbnJvbGxtZW50MSA8LSBlbnJvbGxtZW50WywgMToyXQ0KZ2RwLmFubnVhbDEgPC0gZ2RwLmFubnVhbA0KYWxsLnN0dWRlbnRzIDwtIGFzLm51bWVyaWMoZW5yb2xsbWVudFs0OjExLCAyXSkNCg0KZ2RwLmFubnVhbCRZZWFyIDwtIGFzLmZhY3RvcihnZHAuYW5udWFsJFllYXIpDQplbnJvbGxtZW50MSRZZWFycyA8LSBhcy5mYWN0b3IoZW5yb2xsbWVudDEkWWVhcnMpDQplbnJvbGxtZW50MSRBbGxfU3R1ZGVudHMgPC0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZW5yb2xsbWVudDEkQWxsX1N0dWRlbnRzKSkNCmBgYA0KDQpNb2RlbCAzOg0KDQogIEZpcnN0IG1ha2luZyBhIGdyYXBoIG9mIGFubnVhbCBHRFAgaGlnaHMgYW5kIGxvd3MgLS0gbWF5YmUgYSB0ZW1wb3JhcnkgcHJveHkgZm9yIHJlY2Vzc2lvbnM/DQpgYGB7ciBncmFwaDEsIGluY2x1ZGUgPSBGQUxTRX0NCmdkcC5hbm51YWwgJT4lDQogIGdncGxvdCgpICsNCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoeCA9IFllYXIsDQogICAgICAgICAgICAgICAgIHkgPSBNYXhHRFAsDQogICAgICAgICAgICAgICAgIGdyb3VwID0gMSkpICsNCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoeCA9IFllYXIsDQogICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBNaW5HRFAsDQogICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwID0gMSkpICsNCiAgdGhlbWVfZWNvbm9taXN0KCkgKw0KICB5bGFiKCdSZWFsIEdEUCcpDQpgYGANCg0KICBBbm51YWwgZW5yb2xsbWVudCBncmFwaDoNCmBgYHtyIGdyYXBoMiwgaW5jbHVkZSA9IEZBTFNFfQ0KZW5yb2xsbWVudDEgJT4lDQogIGdncGxvdCgpICsNCiAgZ2VvbV9saW5lKG1hcHBpbmcgPSBhZXMoeCA9IFllYXJzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gQWxsX1N0dWRlbnRzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cCA9IDEpKSArDQogIHRoZW1lX2Vjb25vbWlzdCgpICsNCiAgeWxhYignRW5yb2xsbWVudCcpDQpgYGANCg0KICBKb2luIGVucm9sbG1lbnQgZGF0YSBhbmQgZ2RwIGRhdGEgdG8gY3JlYXRlIGxpbmVhciBtb2RlbCB0ZXN0Og0KYGBge3IgbG0xLCBpbmNsdWRlID0gRkFMU0V9DQp0ZXN0IDwtIGlubmVyX2pvaW4oZW5yb2xsbWVudDEsIGdkcC5hbm51YWwxLA0KICAgICAgICAgIGJ5ID0gYygiWWVhcnMiID0gIlllYXIiKSkNCg0KbG0xIDwtIGxtKEFsbF9TdHVkZW50cyB+IE1heEdEUCwNCiAgICAgICAgICBkYXRhID0gdGVzdCwNCiAgICAgICAgICBuYS5hY3Rpb24gPSBuYS5vbWl0KQ0Kc3VtbWFyeShsbTEpDQpgYGANCg0KICBHcmFwaCBpdD8NCmBgYHtyIGdyYXBoM180LCBpbmNsdWRlID0gRkFMU0V9DQp0ZXN0ICU+JQ0KICBnZ3Bsb3QoKSArDQogIGdlb21fbGluZShhZXMoeCA9IFllYXJzLA0KICAgICAgICAgICAgICAgICB5ID0gQWxsX1N0dWRlbnRzLA0KICAgICAgICAgICAgICAgIGdyb3VwID0gMSkpICsNCiAgdGhlbWVfZWNvbm9taXN0KCkgKw0KICB5bGFiKCdFbnJvbGxtZW50IGJ5IEFsbCBTdHVkZW50cycpDQoNCnRlc3QgJT4lDQogIGdncGxvdCgpICsNCiAgZ2VvbV9saW5lKGFlcyh4ID0gWWVhcnMsDQogICAgICAgICAgICAgICAgIHkgPSBNYXhHRFAsDQogICAgICAgICAgICAgICAgIGdyb3VwID0gMSkpICsNCiAgIyBnZW9tX2FibGluZShzbG9wZSA9IDAuODAxNSwgaW50ZXJjZXB0ID0gNjMxNi43MjA3KSArDQogIHRoZW1lX2Vjb25vbWlzdCgpDQpgYGANCg0KQ29sbGVnZSBQcm94aW1pdHkgUXVlc3Rpb24gNS8zOg0KKFJlYWRpbmcgaW4gSXZ5J3MgZGF0YSkNCmBgYHtyIHJlYWQgcHJveGltaXR5IGRhdGEsIHJlc3VsdHMgPSAibWFya3VwIn0NCiMgY3pfY29sbGVnZSA8LSByZWFkX2R0YSgiY3pfY29sbGVnZS5kdGEiKQ0KY3ogPC0gcmVhZF9kdGEoJ2N6LmR0YScpDQojIGNvbGxlZ2VzIDwtIHJlYWRfZHRhKCdjb2xsZWdlcy5kdGEnKQ0KIyBtb2JpbGl0eS5yZXN1bHRzIDwtIHJlYWRfeGxzeCgnbW9iaWxpdHlfcmVzdWx0cy54bHN4JykNCmBgYA0KDQpSZWFkIGluL2NyZWF0ZSBtb2JpbGl0eSBkYXRhOg0KKFRyZW5kcyBpbiBNb2JpbGl0eTogQ29tbXV0aW5nIFpvbmUgSW50ZXJnZW5lcmF0aW9uYWwgTW9iaWxpdHkgRXN0aW1hdGVzIGJ5IEJpcnRoIENvaG9ydCkNCmh0dHBzOi8vb3Bwb3J0dW5pdHlpbnNpZ2h0cy5vcmcvZGF0YS8/Z2VvZ3JhcGhpY19sZXZlbD0xMDEmdG9waWM9MCZwYXBlcl9pZD0wI3Jlc291cmNlLWxpc3RpbmcNCmBgYHtyIG1vYmlsaXR5IGRhdGEsIGluY2x1ZGU9RkFMU0V9DQojIG1vYmlsaXR5LmRhdGEgPC0gcmVhZF94bHMoJ29ubGluZWRhdGExX3RyZW5kcy54bHMnKQ0KIyBjb2xuYW1lcyhtb2JpbGl0eS5kYXRhKSA8LSBtb2JpbGl0eS5kYXRhWzE1LCBdDQojIG1vYmlsaXR5IDwtIG1vYmlsaXR5LmRhdGFbLWMoMToxNiksIF0NCiMgbW9iaWxpdHkuMTk4NiA8LSBtb2JpbGl0eSAlPiUNCiMgICBmaWx0ZXIoYEJpcnRoIENvaG9ydGAgPT0gMTk4NikNCiMgbW9iaWxpdHkuMTk4NiRgQ29tbXV0aW5nIFpvbmVgIDwtIGFzLm51bWVyaWMobW9iaWxpdHkuMTk4NiRgQ29tbXV0aW5nIFpvbmVgKQ0KIyBjei5tb2JpbGl0eS5kYXRhIDwtIGZ1bGxfam9pbihtb2JpbGl0eS4xOTg2WywgYygxLCAzOjgpXSwNCiMgICAgICAgICAgICAgICAgICAgY3osDQojICAgICAgICAgICAgICAgICAgIGJ5ID0gYyhgQ29tbXV0aW5nIFpvbmVgID0gJ2N6JykpDQojIA0KIyBjei5tb2JpbGl0eSA8LSBjei5tb2JpbGl0eS5kYXRhWywgYygxOjgsIDIxMzI6MjEzNyldDQojIGN6Lm1vYmlsaXR5IDwtIGN6Lm1vYmlsaXR5WywgYygxLCA4LCA5OjE0LCAzOjcsIDIpXQ0KIyB3cml0ZV9jc3YoY3oubW9iaWxpdHksICdjei5tb2JpbGl0eS5jc3YnKQ0KY3oubW9iaWxpdHkgPC0gcmVhZF9jc3YoJ2N6Lm1vYmlsaXR5LmNzdicpDQpgYGANCg0KUmVhZCBpbiBnZW9qc29uIGZpbGU6DQpgYGB7ciBnZW9qc29ufQ0KY3ouZ2VvanNvbiA8LSBnZW9qc29uX3JlYWQoImN6MTk5MC5qc29uIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIHdoYXQgPSAic3AiKQ0KIyBWaWV3KGN6Lmdlb2pzb25AZGF0YSkNCiMgY3ouZ2VvanNvbiAlPiUNCiMgICBsZWFmbGV0KCkgJT4lDQojICAgI2FkZFRpbGVzKCkgJT4lDQojICAgYWRkUG9seWdvbnMoKSAlPiUNCiMgICBzZXRWaWV3KC05NiwgMzcuOCwgMykNCmBgYA0KDQpDb21tdXRpbmcgem9uZXMgb24gdGhlIG1hcCAoY3ouZ2VvanNvbkBkYXRhKSBhcmUgaW4gMTk5MHMgZm9ybWF0LiBUaGV5IG5lZWQgdG8gYmUgY29udmVydGVkIHNvIG91ciBwb3N0LTIwMDAgZGF0YSBjYW4gYmUgY29ubmVjdGVkIHRvIHRoZSBzaGFwZWZpbGVzOg0KKGh0dHBzOi8vd3d3LmVycy51c2RhLmdvdi9kYXRhLXByb2R1Y3RzL2NvbW11dGluZy16b25lcy1hbmQtbGFib3ItbWFya2V0LWFyZWFzLykNCmBgYHtyIGN6IHNoYXBlIGNvbWJpbmUsIGluY2x1ZGUgPSBGQUxTRX0NCmN6LmNvbnZlcnNpb25zIDwtIHJlYWRfeGxzKCdjejAwX2Vxdl92MS54bHMnKQ0KY3ouY29udmVyc2lvbnMgPC0gY3ouY29udmVyc2lvbnNbLCBjKDI6NCldDQpjei5jb252ZXJzaW9ucyRgQ29tbXV0aW5nIFpvbmUgSUQsIDE5OTBgIDwtIGFzLm51bWVyaWMoY3ouY29udmVyc2lvbnMkYENvbW11dGluZyBab25lIElELCAxOTkwYCkNCmN6LmNvbnZlcnNpb25zJGBDb21tdXRpbmcgWm9uZSBJRCwgMTk4MGAgPC0gYXMubnVtZXJpYyhjei5jb252ZXJzaW9ucyRgQ29tbXV0aW5nIFpvbmUgSUQsIDE5ODBgKQ0KY29sbmFtZXMoY3ouY29udmVyc2lvbnMpWzJdIDwtICdjejE5OTAnDQpjb2xuYW1lcyhjei5jb252ZXJzaW9ucylbMV0gPC0gJ2N6MjAwMCcNCmNvbG5hbWVzKGN6LmNvbnZlcnNpb25zKVszXSA8LSAnY3oxOTgwJw0KDQpoZWFkKGN6Lmdlb2pzb25AZGF0YSkNCmN6LmdlbyA8LSBjei5nZW9qc29uDQpjb2xuYW1lcyhjei5tb2JpbGl0eSlbMV0gPC0gJ2N6MTk5MCcNCg0KY3ouZ2VvQGRhdGEgPC0gZnVsbF9qb2luKGN6Lmdlb0BkYXRhLA0KICAgICAgICAgICAgICAgICAgY3ouY29udmVyc2lvbnNbLCAtM10sDQogICAgICAgICAgICAgICAgICBieSA9IGMoJ2N6JyA9ICdjejE5OTAnKSkNCmN6Lmdlb0BkYXRhIDwtIGxlZnRfam9pbihjei5nZW9AZGF0YSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBjei5tb2JpbGl0eSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBieSA9IGMoJ2N6JyA9ICdjejE5OTAnKSkNCg0KY3ouZ2VvICU+JQ0KICBsZWFmbGV0KCkgJT4lDQogIGFkZFBvbHlnb25zKCkgJT4lDQogIHNldFZpZXcoLTk2LCAzNy44LCAzKQ0KYGBgDQoNClRyeSB0byBydW4gc29tZSBsbXM6DQoNCiAgSXZ5J3MgU1RBVEEgY29kZToNCg0KICAgIGZvcmVhY2ggeCBvZiB2YXJsaXN0IG5jb2xsZWdlIG5mb3VyeXIgbmZvdXJ5cnByaXYgbnB1YiBuZWxpdGUgaGFzY29sbGVnZXsNCiAgICAJDQogICAgZm9yZWFjaCB5IG9mIHZhcmxpc3Qga2ZyX3Bvb2xlZF9wb29sZWRfcDEga2ZyX3Bvb2xlZF9wb29sZWRfcDI1IGtmcl9wb29sZWRfcG9vbGVkX3A1MCBrZnJfcG9vbGVkX3Bvb2xlZF9wNzUga2ZyX3Bvb2xlZF9wb29sZWRfcDEwMCB7DQogICAgCXJlZyBgeScgYHgnIHBvcGRlbnNpdHkyMDEwIG1lZF9oaGluYzIwMTYsIHIgDQogICAgCW91dHJlZzIgdXNpbmcgYHgnX2tmciwgZXhjZWwgYXBwZW5kIGN0aXRsZShgeScpDQogICAgfQ0KICAgIA0KICBWYXJpYWJsZXMgb2YgaW50ZXJlc3Q6DQogIA0KYGBge3J9DQp5dmFyMSA8LSAia2ZyX3Bvb2xlZF9wb29sZWRfcDEiDQp4dmFyczEgPC0gYygibmNvbGxlZ2UiLCAibmZvdXJ5ciIsICJuZm91cnlycHJpdiIsICJucHViIiwgIm5lbGl0ZSIsICJoYXNjb2xsZWdlIiwgInBvcGRlbnNpdHkyMDEwIiwgIm1lZF9oaGluYzIwMTYiKQ0KY3oxIDwtIGN6WywgYyh5dmFyMSwgeHZhcnMxKV0NCg0KbG0ubW9kZWwxIDwtIGFzLmZvcm11bGEocGFzdGUwKHl2YXIxLCAiIH4gIiwgcGFzdGUwKHh2YXJzMSwgY29sbGFwc2UgPSAgIiArICIpKSkNCg0KYGBgDQoNCnRlc3Rpbmc/DQpgYGB7cn0NCmxtLmtmcl9wMSA8LSBsbShsbS5tb2RlbDEsDQogICAgICAgICAgICAgICAgZGF0YSA9IGN6KQ0Kc3VtbWFyeShsbS5rZnJfcDEpDQoNCnN0YXJnYXplcihjejEsIHR5cGUgPSAidGV4dCIsIHRpdGxlPSJEZXNjcmlwdGl2ZSBzdGF0aXN0aWNzIiwgZGlnaXRzPTEsIG91dD0idGFibGUxLnR4dCIpDQoNCnN0YXJnYXplcihsbS5rZnJfcDEsDQogICAgICAgICAgdHlwZSA9ICJ0ZXh0IiwNCiAgICAgICAgICBkZXAudmFyLmxhYmVscyA9IGMoImtmcl9wb29sZWRfcG9vbGVkX3AxIikpDQogIyAgICAgICAgICAsDQogIyAgICAgICAgICBjb3ZhcmlhdGUubGFiZWxzID0gYygiR3Jvc3MgaG9yc2Vwb3dlciIsICJSZWFyIGF4bGUgcmF0aW8iLCJGb3VyIGZvd2FyZCBnZWFycyIsDQogIyAiRml2ZSBmb3J3YXJkIGdlYXJzIiwiVHlwZSBvZiB0cmFuc21pc3Npb24gKG1hbnVhbD0xKSIpLCBvdXQ9Im1vZGVscy50eHQiKQ0KDQoNCmBgYA0KDQpuZWxpdGUgb24ga2ZyIGF0IGRpZmZlcmVudCBsZXZlbHMNCmBgYHtyfQ0KeXZhci5wMSA8LSAia2ZyX3Bvb2xlZF9wb29sZWRfcDEiDQp5dmFyLnAyNSA8LSAia2ZyX3Bvb2xlZF9wb29sZWRfcDI1Ig0KeXZhci5wNTAgPC0gImtmcl9wb29sZWRfcG9vbGVkX3A1MCINCnl2YXIucDc1IDwtICJrZnJfcG9vbGVkX3Bvb2xlZF9wNzUiDQp5dmFyLnAxMDAgPC0gImtmcl9wb29sZWRfcG9vbGVkX3AxMDAiDQp4dmFycy5uZWxpdGUgPC0gYygibmVsaXRlIiwgInBvcGRlbnNpdHkyMDEwIiwgIm1lZF9oaGluYzIwMTYiKQ0KbG0ubmVsaXRlLnAxIDwtIGFzLmZvcm11bGEocGFzdGUwKHl2YXIucDEsICIgfiAiLCBwYXN0ZTAoeHZhcnMubmVsaXRlLCBjb2xsYXBzZSA9ICAiICsgIikpKQ0KbG0ubmVsaXRlLnAyNSA8LSBhcy5mb3JtdWxhKHBhc3RlMCh5dmFyLnAyNSwgIiB+ICIsIHBhc3RlMCh4dmFycy5uZWxpdGUsIGNvbGxhcHNlID0gICIgKyAiKSkpDQpsbS5uZWxpdGUucDUwIDwtIGFzLmZvcm11bGEocGFzdGUwKHl2YXIucDUwLCAiIH4gIiwgcGFzdGUwKHh2YXJzLm5lbGl0ZSwgY29sbGFwc2UgPSAgIiArICIpKSkNCmxtLm5lbGl0ZS5wNzUgPC0gYXMuZm9ybXVsYShwYXN0ZTAoeXZhci5wNzUsICIgfiAiLCBwYXN0ZTAoeHZhcnMubmVsaXRlLCBjb2xsYXBzZSA9ICAiICsgIikpKQ0KbG0ubmVsaXRlLnAxMDAgPC0gYXMuZm9ybXVsYShwYXN0ZTAoeXZhci5wMTAwLCAiIH4gIiwgcGFzdGUwKHh2YXJzLm5lbGl0ZSwgY29sbGFwc2UgPSAgIiArICIpKSkNCm5lbGl0ZS5wMSA8LSBsbShsbS5uZWxpdGUucDEsIGN6KQ0KbmVsaXRlLnAyNSA8LSBsbShsbS5uZWxpdGUucDI1LCBjeikNCm5lbGl0ZS5wNTAgPC0gbG0obG0ubmVsaXRlLnA1MCwgY3opDQpuZWxpdGUucDc1IDwtIGxtKGxtLm5lbGl0ZS5wNzUsIGN6KQ0KbmVsaXRlLnAxMDAgPC0gbG0obG0ubmVsaXRlLnAxMDAsIGN6KQ0KdHh0dGFibGUubmVsaXRlIDwtIHN0YXJnYXplcihuZWxpdGUucDEsIG5lbGl0ZS5wMjUsIG5lbGl0ZS5wNTAsIG5lbGl0ZS5wNzUsIG5lbGl0ZS5wMTAwLA0KICAgICAgICAgIHR5cGUgPSAidGV4dCIsDQogICAgICAgICAgdGl0bGUgPSAiVGhlIEVmZmVjdCBvZiBFbGl0ZSBDb2xsZWdlcyBpbiBDb21tdXRpbmcgWm9uZSBvbiB0aGUgUHJvYmFiaWxpdHkgdGhhdCBhIENoaWxkIGZyb20gdGhlIDIwdGggUGVyY2VudGlsZSBGYWxscyBpbiBFYWNoIEluY29tZSBQZXJjZW50aWxlIGFzIGFuIEFkdWx0IiwNCiAgICAgICAgICBkZXAudmFyLmNhcHRpb24gPSAiUGFyZW50IEluY29tZSBQZXJjZW50aWxlIiwNCiAgICAgICAgICBkZXAudmFyLmxhYmVscyA9IGMoIkJvdHRvbSAxJSIsICIyNSUiLCAiNTAlIiwgIjc1JSIsICJUb3AgMSUiKSwNCiAgICAgICAgICAjIG5vdGVzID0gIldoZXJlIG5lbGl0ZSBpcyB0aGUgbnVtYmVyIG9mIGVsaXRlIGNvbGxlZ2VzIGluIGNvbW11dGluZyB6b25lIChjeiksIHBvcGRlbnNpdHkyMDEwIGlzIHRoZSBjeidzIHBvcHVsdGlvbiBkZW5zaXR5LCBhbmQgbWVkX2hoaW5jMjAxNiBpcyB0aGUgbWVkaWFuIGhvdXNlaG9sZCBpbmNvbWUgaW4gY3ogaW4gMjAxNi4iLA0KICAgICAgICAgICMgbm90ZXMuYXBwZW5kID0gVFJVRSwNCiAgICAgICAgICAjIG5vdGVzLmFsaWduID0gImwiLA0KICAgICAgICAgIG91dCA9ICJuZWxpdGV0YWJsZS50eHQiKQ0KaHRtdGFibGUubmVsaXRlIDwtIHN0YXJnYXplcihuZWxpdGUucDEsIG5lbGl0ZS5wMjUsIG5lbGl0ZS5wNTAsIG5lbGl0ZS5wNzUsIG5lbGl0ZS5wMTAwLA0KICAgICAgICAgIHR5cGUgPSAiaHRtbCIsDQogICAgICAgICAgZGVwLnZhci5sYWJlbHMgPSBjKCJCb3R0b20gMSUiLCAiMjUlIiwgIjUwJSIsICI3NSUiLCAiVG9wIDElIiksDQogICAgICAgICAgb3V0ID0gIm5lbGl0ZXRhYmxlLmh0bWwiKQ0Kc3VtbWFyeShsbS5uZWxpdGUucDEpDQpgYGANCg0KDQoNCkFkZCBhIG5ldyBjaHVuayBieSBjbGlja2luZyB0aGUgKkluc2VydCBDaHVuayogYnV0dG9uIG9uIHRoZSB0b29sYmFyIG9yIGJ5IHByZXNzaW5nICpDdHJsK0FsdCtJKi4NCg0KV2hlbiB5b3Ugc2F2ZSB0aGUgbm90ZWJvb2ssIGFuIEhUTUwgZmlsZSBjb250YWluaW5nIHRoZSBjb2RlIGFuZCBvdXRwdXQgd2lsbCBiZSBzYXZlZCBhbG9uZ3NpZGUgaXQgKGNsaWNrIHRoZSAqUHJldmlldyogYnV0dG9uIG9yIHByZXNzICpDdHJsK1NoaWZ0K0sqIHRvIHByZXZpZXcgdGhlIEhUTUwgZmlsZSkuDQoNClRoZSBwcmV2aWV3IHNob3dzIHlvdSBhIHJlbmRlcmVkIEhUTUwgY29weSBvZiB0aGUgY29udGVudHMgb2YgdGhlIGVkaXRvci4gQ29uc2VxdWVudGx5LCB1bmxpa2UgKktuaXQqLCAqUHJldmlldyogZG9lcyBub3QgcnVuIGFueSBSIGNvZGUgY2h1bmtzLiBJbnN0ZWFkLCB0aGUgb3V0cHV0IG9mIHRoZSBjaHVuayB3aGVuIGl0IHdhcyBsYXN0IHJ1biBpbiB0aGUgZWRpdG9yIGlzIGRpc3BsYXllZC4NCg==